﻿// Inner Fire 游戏引擎库
// LayerSetting - 游戏层配置
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于配置一个层系列的信息。讲道理来说应该整个游戏框架下只需要一个层的配置。
// 因为如果在以后的扩展中，每个玩家使用不同的层，那么就会导致“语言不通”，这非常蛋痛。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-24

#include "layer_setting.h"

namespace ifire::game {

LayerInfo::LayerInfo(const ikit::XmlNode& node)
    : id(node("ID")), name(node("Name")) {}

MaskInfo::MaskInfo(const ikit::XmlNode& node)
    : name(node("Name")), list(node.Value()), mask(0) {}


LayerSetting::LayerSetting(ConfigManager* manager, const ikit::XmlNode& node)
    : ConfigInfo(manager, node("Name")) {
  node.ReadItems("Layer", layers_);
  node.ReadItems("Mask", masks_);
  // 计算每一个Mask的掩码
  for(auto& i : masks_){
    i.mask = CalculateLayerMask(i.list);
    KLOG("Mask: %s, flag:", i.list.data());
    ikit::print_binary_64(i.mask);
  }
}

LayerSetting::~LayerSetting() {}

int LayerSetting::GetLayer(ikit::sstr name) {
  for (auto& i : layers_) {
    if (i.name == name) return i.id;
  }
  return 0;
}

// 通过名称获得Mask
uint64_t LayerSetting::GetMask(ikit::sstr name) {
  for (auto& i : masks_) {
    if (i.name == name) return i.mask;
  }
  return 0;
}

uint64_t LayerSetting::CalculateLayerMask(const eastl::string_view& name_list) {
  uint64_t mask = 0;

  // 空字符串直接返回0
  if (name_list.empty()) {
    return mask;
  }

  // 分割字符串
  size_t start = 0;
  size_t end = name_list.find(',');

  while (end != eastl::string_view::npos) {
    // 提取单个layer名称
    eastl::string_view layer_name = name_list.substr(start, end - start);

    // 获取layer ID并加入mask
    int layer_id = GetLayer(layer_name.data());
    if (layer_id >= 0 && layer_id < 64) { // 确保ID在合法范围内
      mask |= (1ULL << layer_id);
    }

    // 移动到下一个名称
    start = end + 1;
    end = name_list.find(',', start);
  }

  // 处理最后一个名称
  eastl::string_view last_layer = name_list.substr(start);
  int last_id = GetLayer(last_layer.data());
  if (last_id >= 0 && last_id < 64) {
    mask |= (1ULL << last_id);
  }

  return mask;
}

} // namespace ifire::game